// -*-mode:c++; coding:utf-8-*-

#ifndef _XBASE_TABLE_MANAGER_HPP_
#define _XBASE_TABLE_MANAGER_HPP_

#include <map>

#include <xthread/read_write_lock.hpp>

#include "table.hpp"

namespace xbase
{
	class table_manager
	{
	public:
		typedef std::map<std::string, table::pointer> table_map;

	public:
		table::pointer get_table(const std::string &p_tablename) const;

		void add_table(const table::pointer &p_table);

		template<typename Container>
		void list_table(Container &list) const {
			Guard<ReadWriteLock::ReadLock> guard(m_tables_lock.read_lock());
			BOOST_FOREACH(const table_map::value_type &elem, m_tables)
			{
				list.push_back(elem.second);
			}
		}
		
		// template<typename Container>
		// void list_tablet(Container &list) const {
		// 	Guard<ReadWriteLock::ReadLock> guard(m_tables_lock.read_lock());
		// 	BOOST_FOREACH(const table_map::value_type &elem, m_tables)
		// 	{
		// 		elem.second->list_tablet(list);
		// 	}
		// }

		// // 注意：！
		// // pred中最好不要有任何锁，否则很容易造成死锁！
		// template<typename Container, typename Pred>
		// void list_tablet_if(Container &list, Pred pred) const {
		// 	Guard<ReadWriteLock::ReadLock> guard(m_tables_lock.read_lock());
		// 	BOOST_FOREACH(const table_map::value_type &elem, m_tables)
		// 	{
		// 		elem.second->list_tablet_if(list, pred);
		// 	}
		// }

		// // 注意：！
		// // proc中最好不要有任何锁，否则很容易造成死锁！
		// template<typename Proc>
		// void for_each(Proc proc) const {
		// 	Guard<ReadWriteLock::ReadLock> guard(m_tables_lock.read_lock());
		// 	BOOST_FOREACH(const table_map::value_type &elem, m_tables)
		// 	{
		// 		proc(elem.second);
		// 	}
		// }

		// for stat
		// uint32_t tablet_number() const;
		// uint32_t memory_table_size() const;
		void get_stat(uint32_t &tablet_number,
			      uint32_t &memory_table_size) const;

	private:
		table_map m_tables;
		mutable ReadWriteLock m_tables_lock;

	};

} // namespace xbase

#endif	// _XBASE_TABLE_MANAGER_HPP_
